package com.springbootblog.controller.fontend.thread;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;

public class TestCallable implements Callable<Boolean>
{

    /**
     * 图片地址
     */
    private String url;
    /**
     * 图片名称
     */
    private String name;

    /**
     * 构造方法
     * @param url
     * @param name
     */
    public TestCallable(String url, String name)
    {
        this.url = url;
        this.name = name;
    }

    /**
     * 线程执行方法体  就是  Thread 中的  run 方法
     * @return
     * @throws Exception
     */
    @Override
    public Boolean call() throws Exception
    {
        // 实例化下载方法
        WebDownloader webDownloader = new WebDownloader();
        // 执行下载方法
        webDownloader.downloader(url, name);
        // 打印下载结果
        System.out.println("download success："+name);
        return true;
    }

    /**
     * 主方法
     * @param args
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException
    {
        // ========================================================================
        // 注意，我这里下载的是同一张图片，我这里同时开启三个线程下载同一张图片，如果是依次执行，则下载顺序是1/2/3  如果是多线程依次执行，那么下载顺序就是一个玄学了。
        // 实例化第一个线程类
        TestCallable TestCallable1 = new TestCallable("https://resource.guanchao.site/uploads/atricle/20240717/6f3d3f8fb88a967650c33a9f5d12187e.jpg","1.jpg");
        // 实例化第二个线程类
        TestCallable TestCallabl2 = new TestCallable("https://resource.guanchao.site/uploads/atricle/20240717/6f3d3f8fb88a967650c33a9f5d12187e.jpg","2.jpg");
        // 实例化第三个线程类
        TestCallable TestCallabl3 = new TestCallable("https://resource.guanchao.site/uploads/atricle/20240717/6f3d3f8fb88a967650c33a9f5d12187e.jpg","3.jpg");

        // 定义一个线程池，放入三个线程
        ExecutorService ser = Executors.newFixedThreadPool(3);

        // 提交执行
        Future<Boolean> result1 = ser.submit(TestCallable1);
        Future<Boolean> result2 = ser.submit(TestCallabl2);
        Future<Boolean> result3 = ser.submit(TestCallabl3);

        // 获取执行结果
        boolean rs1 = result1.get();
        boolean rs2 = result1.get();
        boolean rs3 = result1.get();
        System.out.println(rs1);
        System.out.println(rs2);
        System.out.println(rs3);

        // 关闭服务
        ser.shutdown();
    }

    /**
     * 下载类
     */
    class WebDownloader
    {
        public void downloader(String url ,String name)
        {
            try
            {
                // 执行下载
                FileUtils.copyURLToFile(new URL(url),new File(name));
            }
            catch (IOException e)
            {
                e.printStackTrace();
                System.out.println("downloader方法出现异常！");
            }
        }
    }
}
